"""
多对多

案例：学生和课程
"""

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 2. 设置数据库的配置信息
# mysql://[用户名]:[密码]@[主机地址][端口号]/[数据库名]
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:123456@127.0.0.1:3306/school"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False


# 3. 创建 sqlalchemy 对象 db，关联 app
db = SQLAlchemy(app)


# 4. 编写模型类，继承自 db.Model

tb_student_course = db.Table(
    "tb_student_course",
    db.Column("student_id", db.Integer, db.ForeignKey("students.id")),
    db.Column("course_id", db.Integer, db.ForeignKey("courses.id")),
)


class Student(db.Model):
    # 【主键】 参数1：表示 id 的类型；参数2：表示 id 的约束类型
    __tablename__ = "students"  # 手动设置表名
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))

    # 关系属性
    # secondary：使用在多对多中，用来表示二次查询的
    courses = db.relationship(
        "Course", backref="students", secondary="tb_student_course"
    )


class Course(db.Model):
    # 【主键】 参数1：表示 id 的类型；参数2：表示 id 的约束类型
    __tablename__ = "courses"  # 手动设置表名
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))


@app.route("/")
def helloworld():
    return "hello world Flask"


if __name__ == "__main__":
    # 创建数据库的表，创建的是继承自 db.Model 的表
    with app.app_context():
        # 删除所有继承自db.Model的表
        db.drop_all()
        # 创建所有继承自db.Model的表
        db.create_all()

        # 添加测试数据
        stu1 = Student(name="张三")
        stu2 = Student(name="李四")
        stu3 = Student(name="王五")

        cou1 = Course(name="物理")
        cou2 = Course(name="化学")
        cou3 = Course(name="生物")

        stu1.courses = [cou2, cou3]
        stu2.courses = [cou2]
        stu3.courses = [cou1, cou2, cou3]

        db.session.add_all([stu1, stu2, stu3])
        db.session.add_all([cou1, cou2, cou3])

        db.session.commit()

    app.run(debug=True)
